package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

/**
假设有一个名为 students 的表，
包含字段 id （主键，自增）、
name （学生姓名，字符串类型）、
age （学生年龄，整数类型）、
grade （学生年级，字符串类型）。
*/

/**
- 编写SQL语句向 students 表中插入一条新记录，学生姓名为 "张三"，年龄为 20，年级为 "三年级"。,
- 编写SQL语句查询 students 表中所有年龄大于 18 岁的学生信息。,
- 编写SQL语句将 students 表中姓名为 "张三" 的学生年级更新为 "四年级"。,
- 编写SQL语句删除 students 表中年龄小于 15 岁的学生记录。
*/

type student struct {
	gorm.Model
	Name  string
	Age   int
	Grade string
}

func main() {
	db := InitDB()
	db.AutoMigrate(&student{})

	stu1 := student{
		Name:  "张三",
		Age:   20,
		Grade: "三年级",
	}

	stu2 := student{
		Name:  "李四",
		Age:   12,
		Grade: "三年级",
	}

	stu3 := student{
		Name:  "赵五",
		Age:   10,
		Grade: "三年级",
	}

	db.Create(&stu1)
	db.Create(&stu2)
	db.Create(&stu3)
	stus := student{}
	db.Debug().Where("age > ?", 18).Find(&stus)

	db.Debug().Model(&student{}).Where("Name = ?", "张三").Update("grade", "四年级")

	db.Debug().Delete(&student{}, "age < ?", 15)
}

func InitDB() *gorm.DB {
	db := ConnectDB()
	return db
}

func ConnectDB() *gorm.DB {
	//dsn := "user:pass@tcp(127.0.0.1:3306)/gorm?charset=utf8mb4&parseTime=True&loc=Local"
	//db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	db, err := gorm.Open(mysql.New(mysql.Config{
		DSN:                       "root:123456@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local",
		DefaultStringSize:         256,   // string 类型字段的默认长度
		DisableDatetimePrecision:  true,  // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,  // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
	}), &gorm.Config{})
	if err != nil {
		panic(err)
	}
	return db
}
